function * foo () {
  console.log('test1')
  // 暂停执行并向外返回值
  var s = yield 'next return data' // 调用next后，返回对象值
  // 注意，上面的代码分两次next
  console.log(s)
  console.log('end code')
}

const gener = foo()
const yields = gener.next()
console.log(yields);
//上面这段代码执行之后，只打印了test1，其余的内容并没有被执行，
//因为这里面有一个关键字yield,他会阻止代码的执行，带了*的函数在执行的时候，
//他不会立即返回函数执行的结果，他会返回一个指针对象，调用指针的next（）方法，他就会向下执行一次
/*
test1
{ value: 'next return data', done: false }
这里就是调用了一次next之后返回的结果，这里可以看到，
函数执行到了第一yield后面的一行代码，但是并没有执行完毕，
这里打印的对象其实就是第三行代码yield 'next return data'给返回的指针对象，
告诉你，这里的值是什么，然后done的值为false，就表示这个函数还没有执行完毕
*/

// 这里就是配合进行了二次调用
const y2 = gener.next(666)
console.log(y2)
/*
test1
{ value: 'next return data', done: false }
666
end code
{ value: undefined, done: true }
这里进行了第二次的next（）调用，然后我们看到打印了一个666，这个值是怎么来的？
它其实是第二次调用next时自己传递的值，赋给了s,然后又打印s得到的值，打印完毕之后，就继续执行了下一行的代码，打印end code 
这里面要注意，第一次调用的时候，它返回的结果是yield 后面的内容，但是，它第二次调用的时候，已经没有yield了，
那怎么办，就可以看出这个value值为undefined,然后后面的done为true就表示，这个执行过程全部结束了
如果有赋值，它不会再第一次的next()的时候执行，它会在第二次next()的时候去赋值。
*/

